package com.wongsi.spring5.controller;


import com.wongsi.spring5.entity.Order;
import com.wongsi.spring5.entity.User;
import com.wongsi.spring5.repository.OrderRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import javax.validation.Valid;

@Slf4j
@Controller
@RequestMapping("/orders")
@SessionAttributes("order")
public class OrderController {
    private OrderRepository orderRepo;

    public OrderController(OrderRepository orderRepo) {
        this.orderRepo = orderRepo;
    }

    @GetMapping("/current")
    public String orderForm(Model model) {
        return "orderForm";
    }

    /**
     *
     * @param order 通过表单提交的Order对象（同时也是session中持有的Object对象）
     * @param errors
     * @param sessionStatus
     * @return
     */
    @PostMapping
    public String processOrder(@Valid Order order, Errors errors,
                               SessionStatus sessionStatus,
                               @AuthenticationPrincipal User user) {
        if (errors.hasErrors()) {
            return "orderForm";
        }
//        从安全上下文中获取一个Authentication对象，然后像下面这样获取它的principal：Authentication authentication =
//            SecurityContextHolder.getContext().getAuthentication();
//        User user = (User) authentication.getPrincipal();

        order.setUser(user);
        log.info("Order submitted: " + order);
        orderRepo.save(order);
        /**
         * 订单保存完成之后，我们就不需要在session中持有它了。
         * 实际上，如果我们不把它清理掉，
         * 那么订单会继续保留在session中，
         * 其中包括与之关联的taco，
         * 下一次的订单将会从旧订单中保存的taco开始。
         * 所以，processOrder()方法请求了一个SessionStatus参数，
         * 并调用了它的setComplete()方法来重置session。
         */
        sessionStatus.setComplete();
        return "redirect:/";
    }
}
